#include "TestCase.h"

using namespace std;

/*******************************************************************************
*  FUNC     :   构造函数初始化一些成员变量
*  ARGS     :
*  RTN      :
*  NOTE     :   默认case没有比对通过
*******************************************************************************/
TestCase::TestCase()
    :passed_(false)
{
}

/*******************************************************************************
*  FUNC     :   析构函数
*  ARGS     :
*  RTN      :
*  NOTE     :
*******************************************************************************/
TestCase::~TestCase()
{
}

/*******************************************************************************
*  FUNC     :   获取case名字
*  ARGS     :
*  RTN      :   case名字
*  NOTE     :
*******************************************************************************/
const string &TestCase::GetName() const
{
    return name_; 
}

/*******************************************************************************
*  FUNC     :   设置case名字
*  ARGS     :   name (case名字)
*  RTN      :
*  NOTE     :
*******************************************************************************/
void TestCase::SetName(const string &name)
{
    name_ = name;
}

/*******************************************************************************
*  FUNC     :   获取case条件
*  ARGS     :
*  RTN      :   case条件
*  NOTE     :
*******************************************************************************/
const CaseConditions &TestCase::GetConditions() const
{
    return conditions_;
}

/*******************************************************************************
*  FUNC     :   设置case条件
*  ARGS     :   conditions (class CaseConditions, case条件)
*  RTN      :   case条件
*  NOTE     :
*******************************************************************************/
void TestCase::SetConditions(const CaseConditions &conditions)
{
    conditions_ = conditions;
}

/*******************************************************************************
*  FUNC     :   比对当前case条件是否符合输入的条件
*  ARGS     :   conditions (class CaseConditions, case条件)
*  RTN      :   符合条件: true, 不符合条件: false
*  NOTE     :   输入条件存在且与当前case条件不相等的则比对不符合条件
*******************************************************************************/
bool TestCase::DoTestCase(const CaseConditions &conditions) const
{
    if (conditions.arch.length() != 0 && conditions.arch != conditions_.arch)
        return false;

    if (conditions.os.length() != 0 && conditions.os != conditions_.os)
        return false;

    if (conditions.version.length() != 0 && conditions.version != conditions_.version)
        return false;

    if (conditions.charset.length() != 0 && conditions.charset != conditions_.charset)
        return false;

    if (conditions.program.length() != 0 && conditions.program != conditions_.program)
        return false;

    return true;
}

/*******************************************************************************
*  FUNC     :   获取pcap文件
*  ARGS     :
*  RTN      :   pcap文件
*  NOTE     :
*******************************************************************************/
const string &TestCase::GetPcap() const
{
    return pcap_;
}

/*******************************************************************************
*  FUNC     :   设置pcap文件
*  ARGS     :   pcap (pcap文件)
*  RTN      :
*  NOTE     :
*******************************************************************************/
void TestCase::SetPcap(const std::string &pcap)
{
    pcap_ = pcap;
}

/*******************************************************************************
*  FUNC     :   增加一个比对结果
*  ARGS     :   cmpData (比对结果内容)
*  RTN      :
*  NOTE     :
*******************************************************************************/
void TestCase::AddCompareData(const std::string &cmpData)
{
    cmpDatas_.push_back(cmpData);
}

/*******************************************************************************
*  FUNC     :   获取需要比对的结果数
*  ARGS     :
*  RTN      :   结果数
*  NOTE     :
*******************************************************************************/
uint32_t TestCase::GetCompareDatasNum() const
{
    return cmpDatas_.size();
}

/*******************************************************************************
*  FUNC     :   获取指定需要比对的结果
*  ARGS     :   idx (比对结果索引)
*  RTN      :   需要比对的结果内容
*  NOTE     :
*******************************************************************************/
const string &TestCase::GetCompareData(uint32_t idx) const
{
    return cmpDatas_[idx];
}

/*******************************************************************************
*  FUNC     :   重载<<符，输出case的相关信息
*  ARGS     :   os (class ostream, 当前为cout)
                oneCase (class TestCase)
*  RTN      :   传入参数os的引用
*  NOTE     :
*******************************************************************************/
ostream &operator<<(ostream &os, const TestCase &oneCase)
{
    os << "name: " << oneCase.name_
        << ", pcap: " << oneCase.pcap_
        << ", conditions: " << oneCase.conditions_
        << ", cmpDatas num: " << oneCase.cmpDatas_.size() << endl;

    return os;

}
